MongoClient = require('mongodb').MongoClient;
Query = require('./Query').Query;

function DB()
{
	this.client = MongoClient;
	this.url = "mongodb://localhost:27017/nodejs";
}
DB.prototype =
{
	save : function(coll_name, doc, err_cb, succ_cb)
	{
		this.client.connect(this.url, function(err, db)
			{
				if (err)
				{
				    err_cb(err);
				    db.close();
				}
				else
				{
					db.collection(coll_name, {w:1}, function(err, collection)
						{
							if (err)
						    {
								db.close();
								err_cb(err);
							}
							else
							{
								collection.insert(doc, {w:1}, function(err, result)
									{
										if (err)
										{
											db.close();
											err_cb(err);
										}
										else
										{
											db.close();
											succ_cb();
										}
									});
							}
						});
				}
			});
	},
	remove : function(coll_name, query, err_cb, succ_cb)
	{
		this.client.connect(this.url, function(err, db)
		{
			if (err)
			{
				db.close();
				err_cb(err);
			}
			else
			{
				db.collection(coll_name, {w:1}, function(err, collection)
				{
					if (err)
					{
						db.close();
						err_cb(err);
					}
					else
					{
						collection.remove(query.doc, {w:1}, function(err, result)
							{
								if (err)
								{
									db.close();
									err_cb(err);
								}
								else
								{
									db.close();
									succ_cb(result);
								}
							});
					}
				});
			}
			
		});
	},
	findOne : function(coll_name, query, err_cb, succ_cb)
	{
		this.client.connect(this.url, function(err, db)
			{
				if (err)
				{
					db.close();
					err_cb(err);
				}
				else
				{
					db.collection(coll_name, {w:1}, function(err, collection)
						{
							if (err)
							{
								db.close();
								err_cb(err);
							}
							else
							{
								collection.findOne(query.doc, function(err, doc)
									{
										if (err)
										{
											db.close();
											err_cb(err);
										}
										else
										{
											db.close();
											succ_cb(doc);
										}
									});
							}
						});
				}
			});
	},
	find : function(coll_name, query, err_cb, succ_cb)
	{
		this.client.connect(this.url, function(err, db)
			{
				if (err)
				{
					db.close();
					err_cb(err);
				}
				else
				{
					db.collection(coll_name, function(err, collection)
						{
							if (err)
							{
								db.close();
								err_cb(err);
							}
							else
							{
								collection.find(query.doc, function(err, cursor)
									{
										if (err)
										{
											db.close();
											err_cb(err);
										}
										else
										{
											db.close();
											succ_cb(cursor);
										}
									});
							}
						});
				}
			});
	},
	modify : function(coll_name, query, update, err_cb, succ_cb)
	{
		this.client.connect(this.url, function(err, db)
			{
				if (err)
				{
					db.close();
					err_cb(err);
				}
				else
				{
					db.collection(coll_name, function(err, collection)
						{
							if (err)
							{
								db.close();
								err_cb(err);
							}
							else
							{
								collection.update(query.doc, update.doc, {multi:true}, function(err, result)
									{
										if (err)
										{
											db.close();
											err_cb(err);
										}
										else
										{
											db.close();
											succ_cb(result);
										}
									});
							}
						});
				}
			});
	}
}




exports.DB = DB;













